#ifndef _I_INTERFACE_ICE_
#define _I_INTERFACE_ICE_
#include <Ice/Identity.ice>
#include "Exceptions.ice"
#include "Record.ice"
#include "Fence.ice"
#include "DeviceMessage.ice"
#include "Device.ice"
#include "DeviceHistoryMessage.ice"
#include "VersionInfo.ice"
#include "WebAccount.ice"
#include "File.ice"
#include "DeviceLimit.ice"
#include "DeviceAlert.ice"
#include "Order.ice"
#include "Offer.ice"
#include "Notification.ice"
#include "PositionURL.ice"
#include "PURecord.ice"
#include "PreDefinedURL.ice"
#include "PosOffer.ice"
#include "Ophistory.ice"
#include "HeartBeatResult.ice"
#include "OneKeyRegistResult.ice"

module serverinterfaces
{
    ["java:type:java.util.LinkedList<databean.Record>"] sequence<databean::Record> records;
    ["java:type:java.util.LinkedList<databean.PURecord>"] sequence<databean::PURecord> puRecords;
    ["java:type:java.util.LinkedList<databean.Ophistory>"] sequence<databean::Ophistory> opHistory;
    ["java:type:java.util.LinkedList<databean.WebAccount>"] sequence<databean::WebAccount> webaccounts;
    ["java:type:java.util.LinkedList<databean.Fence>"] sequence<databean::Fence> fences;
    ["java:type:java.util.LinkedList<databean.DeviceMessage>"] sequence<databean::DeviceMessage> messages;
    ["java:type:java.util.LinkedList<databean.DeviceAlert>"] sequence<databean::DeviceAlert> alerts;
    ["java:type:java.util.LinkedList<databean.DeviceHistoryMessage>"] sequence<databean::DeviceHistoryMessage> deviceHistoryMessages;
    ["java:type:java.util.LinkedList<databean.Device>"] sequence<databean::Device> deviceList;
    ["java:type:java.util.LinkedList<databean.File>"] sequence<databean::File> fileList;
    ["java:type:java.util.LinkedList<databean.Offer>"] sequence<databean::Offer> offerList;
    ["java:type:java.util.LinkedList<databean.PositionURL>"] sequence<databean::PositionURL> positionURLList;
    ["java:type:java.util.LinkedList<databean.PreDefinedURL>"] sequence<databean::PreDefinedURL> pdefURLList;
    ["java:type:java.util.LinkedList<databean.PosOffer>"] sequence<databean::PosOffer> posOffers;
    ["java:protobuf:com.push.message.RecordPB.Record"] sequence<byte> RecordPB;
    ["java:protobuf:com.push.message.RecordListPB.RecordList"] sequence<byte> RecordListPB;
    ["java:protobuf:com.push.message.FilePB.File"] sequence<byte> filePB;
    ["java:type:java.util.LinkedList<com.push.message.FilePB.File>"] sequence<filePB> filePBList;
    ["java:protobuf:com.push.message.MailConfig.SMTPConfigPB"] sequence<byte> SMTPConfigPB;
    ["java:protobuf:com.push.message.ActionPriorityPB.ActionPriority"] sequence<byte> ActionPriorityPB;
    sequence<byte> bytearray;
    dictionary<string ,bool> iconExistingMap;
    dictionary<string ,bytearray> iconMap;
    dictionary<string ,string> paramMap;
     dictionary<int, ActionPriorityPB> priorityMap;sequence<string> stringarray;

    interface Interfaces
    {
        /**
         * 登陆接口
         * @param [in] [phone] [电话号码]
         * @param [in] [password] [密码]
         * @param [in] [identity] [设备序列号] 唯一标识设备的信息
         * @param [in] [model] [设备型号]
         * @param [out] [configmap] [返回的客户端存储在服务器上的配置]
         * @return [string] 登陆令牌（token）,作为身份认证信息，登陆每个请求都要带上token，否则报AccountException
         * @exception/throws AccountException 登陆异常、账号异常
         * @exception/throws DatabaseException 数据异常
         * @exception/throws LogOnOtherDeviceException 账户在其它设备登陆,errormessage为上次登录手机的型号
         */
        string login(string phone, string password, string identity, string model, out databean::Device device) throws cusexception::DatabaseException, cusexception::AccountException, cusexception::LogOnOtherDeviceException;
        
        /**
         * 登陆接口
         * @param [in] [phone] [电话号码]
         * @param [in] [password] [密码]
         * @param [in] [identity] [设备序列号] 唯一标识设备的信息
         * @param [in] [model] [设备型号]
         * @param [in] [groupId] [用户分组]
         * @param [out] [configmap] [返回的客户端存储在服务器上的配置]
         * @return [string] 登陆令牌（token）,作为身份认证信息，登陆每个请求都要带上token，否则报AccountException
         * @exception/throws AccountException 登陆异常、账号异常
         * @exception/throws DatabaseException 数据异常
         * @exception/throws LogOnOtherDeviceException 账户在其它设备登陆,errormessage为上次登录手机的型号
         */
        string loginWithGroupId(string phone, string password, string identity, string model, int groupId, out databean::Device device) throws cusexception::DatabaseException, cusexception::AccountException, cusexception::LogOnOtherDeviceException;


        /**
         * 登陆确认，在登陆接口抛出LogOnOtherDeviceException异常时使用
         * @param [in] [phone] [电话号码]
         * @param [in] [password] [密码]
         * @param [in] [identity] [设备序列号] 唯一标识设备的信息
         * @param [in] [model] [设备型号]
         * @param [out] [configmap] [返回的客户端存储在服务器上的配置]
         * @return [string] 登陆令牌（token）,作为身份认证信息，登陆每个请求都要带上token，否则报AccountException
         * @exception/throws AccountException 登陆异常、账号异常
         * @exception/throws DatabaseException 数据异常
         */
        string loginConfirm(string phone, string password, string identity, string model, out databean::Device device) throws cusexception::DatabaseException, cusexception::AccountException;

        /**
         * 登陆确认，在登陆接口抛出LogOnOtherDeviceException异常时使用
         * @param [in] [phone] [电话号码]
         * @param [in] [password] [密码]
         * @param [in] [identity] [设备序列号] 唯一标识设备的信息
         * @param [in] [model] [设备型号]
         * @param [in] [groupId] [用户分组,1表示关爱版用户]
         * @param [out] [configmap] [返回的客户端存储在服务器上的配置]
         * @return [string] 登陆令牌（token）,作为身份认证信息，登陆每个请求都要带上token，否则报AccountException
         * @exception/throws AccountException 登陆异常、账号异常
         * @exception/throws DatabaseException 数据异常
         */
        string loginConfirmWithGroupId(string phone, string password, string identity, string model, int groupId, out databean::Device device) throws cusexception::DatabaseException, cusexception::AccountException;

        /**
         * 判断图标是否存在
         * @param [in] [token] [登陆令牌]
         * @param [in] [names] [软件名称数组]
         * @param [out] [iconExistingMap] [名称为key, true表示图标在服务器已存在, false表示图标在服务器不存在]
         * @exception/throws AccountException token失效，需重新登陆
         */
        iconExistingMap judgeIcons(string token, databean::stringList names) throws cusexception::AccountException;
        
        /**
         * 取得图标数据
         * @param [in] [token] [登陆令牌]
         * @param [in] [names] [软件名称数组]
         * @param [out] [iconMap] [名称为key, byte[]为图标数据]
         * @exception/throws AccountException token失效，需重新登陆
         */
        iconMap getIcons(string token, databean::stringList names) throws cusexception::AccountException;

        /**
         * 取得发送邮件的smtp配置
         * @param [in] [token] [登陆令牌]
         * @param [in] [names] [软件名称数组]
         * @param [out] [iconMap] [名称为key, byte[]为图标数据]
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws AuthException 没有权限
         */
        SMTPConfigPB getSMTPConfig(string token) throws cusexception::AccountException, cusexception::AuthException;

         /**
         * 取得关注号码的smtp配置
         * @param [in] [token] [登陆令牌]
         * @param [in] [names] [软件名称数组]
         * @param [out] [iconMap] [名称为key, byte[]为图标数据]
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws AuthException 没有权限
         */
        SMTPConfigPB getRemoteSMTPConfig(string token, string phone) throws cusexception::AccountException, cusexception::AuthException;

        /**
         * 添加发送邮件的smtp配置
         * @param [in] [token] [登陆令牌]
         * @param [in] [names] [软件名称数组]
         * @param [out] [iconMap] [名称为key, byte[]为图标数据]
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws AuthException 没有权限
         */
        void addOrUpdateSMTPConfig(string token, string email, string password, bool isSSL, string smtpHost, int smtpPort) throws cusexception::AccountException, cusexception::AuthException;

        /**
         * 添加发送邮件的smtp配置
         * @param [in] [token] [登陆令牌]
         * @param [in] [names] [软件名称数组]
         * @param [out] [iconMap] [名称为key, byte[]为图标数据]
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws AuthException 没有权限
         */
        void addOrUpdateBackupSMTPConfig(string token, string email, string password, bool isSSL, string smtpHost, int smtpPort) throws cusexception::AccountException, cusexception::AuthException;
        /**
         * 添加关注手机号码的发送邮件的smtp配置
         * @param [in] [token] [登陆令牌]
         * @param [in] [phone] [关注的手机号码]
         * @param [in] [email] [邮件地址]
         * @param [in] [isSSL] [是否ssl，默认传false]
         * @param [in] [smtpHost] [邮箱smtp服务器地址，默认传空值表示由服务器根据邮箱域名自动判断smtp服务器地址]
         * @param [in] [smtpPort] [smtpPort，默认传0]
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws AuthException 没有权限
         */
        void addOrUpdateRemoteSMTPConfig(string token, string phone,string email, string password, bool isSSL, string smtpHost, int smtpPort) throws cusexception::AccountException, cusexception::AuthException;

        /**
         * 添加关注手机号码的发送邮件的smtp配置
         * @param [in] [token] [登陆令牌]
         * @param [in] [phone] [关注的手机号码]
         * @param [in] [email] [邮件地址]
         * @param [in] [isSSL] [是否ssl，默认传false]
         * @param [in] [smtpHost] [邮箱smtp服务器地址，默认传空值表示由服务器根据邮箱域名自动判断smtp服务器地址]
         * @param [in] [smtpPort] [smtpPort，默认传0]
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws AuthException 没有权限
         */
        void addOrUpdateRemoteBackupSMTPConfig(string token, string phone,string email, string password, bool isSSL, string smtpHost, int smtpPort) throws cusexception::AccountException, cusexception::AuthException;
        /**
         * 更新图标数据
         * @param [in] [token] [登陆令牌]
         * @param [in] [iconMap] [名称为key, byte[]为图标数据]
         * @exception/throws AccountException token失效，需重新登陆
         */
        void updateIcons(string token, iconMap icondata) throws cusexception::AccountException;
        
        /**
         * 更新在线状态和电量
         * @param [in] [token] [登陆令牌]
         * @param [in] [power] [设备在腾讯信鸽注册的token]
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         */
        void keepAlive(string token, int power) throws cusexception::AccountException, cusexception::DatabaseException;
        
        /**
         * 更新在线状态和电量,并返回是否需要上传日志
         * @param [in] [token] [登陆令牌]
         * @param [in] [power] [设备在腾讯信鸽注册的token]
         * @param [out] [requestId] [请求id，空表示不需要上传]
         * @param [out] [start] [日志开始时间戳-1表示崩溃日志]
         * @param [out] [end] [日志结束时间戳,-1表示崩溃日志]
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         */
        void keepAliveAndGetLogInfo(string token, int power, out string requestId, out long start, out long end) throws cusexception::AccountException, cusexception::DatabaseException;
        
        /**
         * 更新在线状态和电量,并返回是否需要上传日志，并返回是否有未完成的操作
         * @param [in] [token] [登陆令牌]
         * @param [in] [power] [设备在腾讯信鸽注册的token]
         * @param [out] [requestId] [请求id，空表示不需要上传]
         * @param [out] [start] [日志开始时间戳-1表示崩溃日志]
         * @param [out] [end] [日志结束时间戳,-1表示崩溃日志]
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         */
        void keepAliveAndGetLogInfoAndGetPendingAction(string token, int power, out databean::HeatBeatResult result) throws cusexception::AccountException, cusexception::DatabaseException;
        
        /**
         * 根据提供的url，返回一个封装的http访问地址(redirectURL)。用户访问返回的地址，会先提示获取位置，再跳转到原始url（生成定位分享信息）
         * @param [in] [token] [登陆令牌]
         * @param [in] [url] [原始链接地址]
         * @param [in] [tile] [标题]
         * @param [in] [imgFileId] [缩略图在阿里oss的id]
         * @param [in] [targetName] [对象名称]
         * @param [in] [intro] [简介]
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws AuthException 权限异常
         */
		databean::PositionURL generatePosition(string token, string url, string tile, string imgFileId, string targetName, string intro)
		throws cusexception::AccountException,  cusexception::AuthException;
		
		/**
         * 根据提供的url，返回一个封装的http访问地址。用户访问返回的地址，会先提示获取位置，再跳转到原始url（生成定位分享信息）
         * @param [in] [token] [登陆令牌]
         * @param [in] [positionURLId] [消息]
         * @param [in] [shareMethod] [分享方式，1短信，2微信
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws AuthException 权限异常
         */
		void confirmPositionURL(string token, string positionURLId, int shareMethod) throws cusexception::AccountException, cusexception::AuthException;
		
		/**
         * 取得按时间倒序排列的已生成的分享定位的列表
         * @param [in] [token] [登陆令牌]
         * @param [in] [time] [截止时间]
         * @param [in] [num] [记录数量]
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws AuthException 权限异常
         */
		positionURLList getPositionURLList(string token, long time, int num, int shareMethod) throws cusexception::AccountException, cusexception::AuthException;
        
        /**
         * 删除指定的定位分享的GPS记录
         * @param [in] [token] [登陆令牌]
         * @param [in] [puRecordId] [PURecordId]
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws AuthException 权限异常
         */
		void deletePURecord(string token, string puRecordId) throws cusexception::AccountException, cusexception::AuthException;
        
        
        /**
         * 取得按时间倒序排列的精选列表
         * @param [in] [token] [登陆令牌]
         * @param [in] [time] [截止时间]
         * @param [in] [num] [记录数量]
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws AuthException 权限异常
         */
		pdefURLList getPreDefinedURLList(string token, long time, int num) throws cusexception::AccountException, cusexception::AuthException;
        
        /**
         * 添加关注号码
         * @param [in] [token] [登陆令牌]
         * @param [in] [phoneNum] [要添加关注的电话号码]
         * @param [in] [password] [关注的电话号码的账户密码]
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 关注号码只能添加三个，超过限制
         * @exception/throws PwdException 密码错误
         * @exception/throws AuthException 帐户没有权限添加关注号码
         */
        void addMoniPhone(string token, string phoneNum, string password, databean::PHONTTYPE type) throws cusexception::AccountException, cusexception::DatabaseException, cusexception::PwdException, cusexception::AuthException;


        /**
         * 判断对方是否为省电版
         * @param [in] [token] [登陆令牌]
         * @param [in] [phoneNum] 被关注号码
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws AuthException 帐户没有权限
         * @return bool, 是否省电版
         */
         bool isRemoteSavePowerVersion(string token, string targetPhone) throws cusexception::AccountException,cusexception::AuthException;

        /**
         * 获取远程号码的离线诊断信息
         * @param [in] [token] [登陆令牌]
         * @param [in] [phoneNum] 被关注号码
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws AuthException 帐户没有权限添加关注号码
         * @return map<String,String>
         *     phone: 对方账号
         *     model: 手机型号
         *     androidVersion: 安卓版本
         *     systemVersion: 系统版本
         *     version: 鹰眼版本
         *     isOnline: 在线状态(true/false)
         *     lastOnlineTime: 最后在线时间
         *     offLineReason:离线原因，比如"对方开机自启动失败"
         *     prompt: 与离线原因配合的提示，比如“将鹰眼的自启动开关打开，然后重启手机”
         */
        paramMap getRemoteoffLineDiagnose(string token, string phone) throws cusexception::AccountException;
        /**
         * 上传离线诊断的检测项目信息
         * @param [in] [token] [登陆令牌]
         * @param [in] [map<String,String>] 检查结果
         * @return map<String,String>
         *     notification: 通知
         *     mic: 麦克风
         *     autoBoot: 自启动
         *     powerSave: 电池优化
         *     actionRecord: 手机行为纪录
         *     screenCapturePriority: 截屏权限
         *     camera: 摄像头
         *     location: 定位
         *     callRecord: 通话记录
         *     message: 短信
         *     contact: 通信录
         * @exception/throws AccountException token失效，需重新登陆
         */
        void uploadOffLineConfig(string token, paramMap map) throws cusexception::AccountException;

        /**
         * 获取远程手机的离线诊断的检测项目信息
         * @param [in] [token] [登陆令牌]
         * @return map<String,String> key定义与uploadOffLineConfig相同
         * @exception/throws AccountException token失效，需重新登陆
         */
        paramMap getRemoteOffLineConfig(string token, string phone) throws cusexception::AccountException;

        /**
         * 删除关注号码
         * @param [in] [token] [登陆令牌]
         * @param [in] [phoneNum] [要添加关注的电话号码]
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         * @exception/throws ParamWrongException phoneNum不是本机的关注号码
         */
        void delMoniPhone(string token, string phoneNum) throws cusexception::AccountException, cusexception::DatabaseException, cusexception::ParamWrongException;
        
    
        /**
         * 发送短信验证码
         * @param [in] [phoneNumber] [电话号码，11位数字]
         * @exception/throws NumberFormatException,DatabaseException 电话号码格式错误,数据访问异常
         */
        void sendVerifyCode(string phoneNumber) throws cusexception::NumberFormatException, cusexception::DatabaseException;
        
        /**
         * 取得运维通知信息(没有时返回空字符串"")
         * @param [in] [token] [登陆令牌]
         * @exception/throws NumberFormatException,DatabaseException 电话号码格式错误,数据访问异常
         */
        databean::Notification getNotification(string token) throws cusexception::AccountException;

        /**
         * 取得通知信息2(没有时返回空字符串"")
         * @param [in] [token] [登陆令牌]
         * @exception/throws NumberFormatException,DatabaseException 电话号码格式错误,数据访问异常
         */
        databean::Notification getNotification2(string token) throws cusexception::AccountException;

        /**
         * 更新运维通知信息
         */
        void updateNotification(long start, long end, string message);

        /**
         * 更新运维通知信息
         */
        void updateNotification2(long start, long end, string message);

        /**
         * 手机号码注册接口
         * @param [in] [phoneNumber] [用户名，电话号码]
         * @param [in] [password] [密码]
         * @param [in] [verifyCode] [6位数字验证码]
         * @param [in] [email] [邮件]
         * @param [in] [smsPhone] [接收短信报警的电话号码]
         * @param [out] [device] [返回的客户端存储在服务器上的配置]
         * @return [string] 登陆令牌（token）,作为身份认证信息，登陆每个请求都要带上token，否则报AccountException
         * @exception/throws NumberFormatException 电话号码格式错误异常
         * @exception/throws DatabaseException 数据访问异常
         * @exception/throws VerifyCodeException 验证码异常（超时、错误等情况）
         * @exception/throws PwdException 密码异常（位数不够，复杂性不满足等情况）
         */
        string regist(string phoneNumber, string password, string verifyCode, string email, string smsPhone, out databean::Device device) 
        throws cusexception::NumberFormatException, cusexception::DatabaseException, cusexception::VerifyCodeException, cusexception::PwdException;
        
        /**
         * 手机号码注册接口
         * @param [in] [phoneNumber] [用户名，电话号码]
         * @param [in] [password] [密码]
         * @param [in] [verifyCode] [6位数字验证码]
         * @param [in] [email] [邮件]
         * @param [in] [smsPhone] [接收短信报警的电话号码]
         * @param [in] [groupId] [0表示普通用户，1表示专版]
         * @param [out] [device] [返回的客户端存储在服务器上的配置]
         * @return [string] 登陆令牌（token）,作为身份认证信息，登陆每个请求都要带上token，否则报AccountException
         * @exception/throws NumberFormatException 电话号码格式错误异常
         * @exception/throws DatabaseException 数据访问异常
         * @exception/throws VerifyCodeException 验证码异常（超时、错误等情况）
         * @exception/throws PwdException 密码异常（位数不够，复杂性不满足等情况）
         */
        string registWithGroupId(string phoneNumber, string password, string verifyCode, string email, string smsPhone, int groupId, out databean::Device device) 
        throws cusexception::NumberFormatException, cusexception::DatabaseException, cusexception::VerifyCodeException, cusexception::PwdException;

        /**
         * 手机号码注册接口
         * @param [in] [phoneNumber] [用户名，电话号码]
         * @param [in] [password] [密码]
         * @param [in] [verifyCode] [6位数字验证码]
         * @param [in] [email] [邮件]
         * @param [in] [smsPhone] [接收短信报警的电话号码]
         * @param [in] [identity] [设备序列号] 唯一标识设备的信息
         * @param [out] [device] [返回的客户端存储在服务器上的配置]
         * @return [string] 登陆令牌（token）,作为身份认证信息，登陆每个请求都要带上token，否则报AccountException
         * @exception/throws NumberFormatException 电话号码格式错误异常
         * @exception/throws DatabaseException 数据访问异常
         * @exception/throws VerifyCodeException 验证码异常（超时、错误等情况）
         * @exception/throws PwdException 密码异常（位数不够，复杂性不满足等情况）
         */
        string registWithIdentity(string phoneNumber, string password, string verifyCode, string email, string smsPhone, string identity,out databean::Device device) 
        throws cusexception::NumberFormatException, cusexception::DatabaseException, cusexception::VerifyCodeException, cusexception::PwdException;

        /**
         * 手机号码注册接口(使用一键注册）
         * @param [in] [phoneNumber] [用户名，电话号码]
         * @param [in] [password] [密码]
         * @param [in] [oneKeyRegistToken] [阿里一键注册sdk返回的token]
         * @param [in] [email] [邮件]
         * @param [in] [smsPhone] [接收短信报警的电话号码]
         * @param [in] [identity] [设备序列号] 唯一标识设备的信息
         * @param [out] [device] [返回的客户端存储在服务器上的配置]
         * @return [string] 登陆令牌（token）,作为身份认证信息，登陆每个请求都要带上token，否则报AccountException
         * @exception/throws NumberFormatException 电话号码格式错误异常
         * @exception/throws DatabaseException 数据访问异常
         * @exception/throws VerifyCodeException 验证码异常（超时、错误等情况）
         * @exception/throws PwdException 密码异常（位数不够，复杂性不满足等情况）
         */
        string registWithIdentityAndOneKeyRegistToken(string phoneNumber, string password, string oneKeyRegistToken, string email, string smsPhone, string identity, out databean::Device device)
        throws cusexception::NumberFormatException, cusexception::DatabaseException, cusexception::VerifyCodeException, cusexception::PwdException;

        /**
         * 手机号码注册接口
         * @param [in] [phoneNumber] [用户名，电话号码]
         * @param [in] [password] [密码]
         * @param [in] [verifyCode] [6位数字验证码]
         * @param [in] [email] [邮件]
         * @param [in] [smsPhone] [接收短信报警的电话号码]
         * @param [in] [identity] [设备序列号] 唯一标识设备的信息
         * @param [in] [groupId] [0表示普通用户，1表示专版]
         * @param [out] [device] [返回的客户端存储在服务器上的配置]
         * @return [string] 登陆令牌（token）,作为身份认证信息，登陆每个请求都要带上token，否则报AccountException
         * @exception/throws NumberFormatException 电话号码格式错误异常
         * @exception/throws DatabaseException 数据访问异常
         * @exception/throws VerifyCodeException 验证码异常（超时、错误等情况）
         * @exception/throws PwdException 密码异常（位数不够，复杂性不满足等情况）
         */
        string registWithGroupIdAndIdentity(string phoneNumber, string password, string verifyCode, string email, string smsPhone, string identity, int groupId, out databean::Device device) 
        throws cusexception::NumberFormatException, cusexception::DatabaseException, cusexception::VerifyCodeException, cusexception::PwdException;
        
       
        
        /**
         * 修改密码(登陆情况下）
         * @param [in] [token] [登陆令牌]
         * @param [in] [newPwd] [新密码]
         * @exception/throws AccountException  token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         * @exception/throws PwdException 密码为空
         */
        void editPassword(string token, string newPwd) throws cusexception::DatabaseException, cusexception::AccountException, cusexception::PwdException;
        
        /**
         * 重置密码（忘记密码未登陆情况下）
         * @param [in] [token] [登陆令牌]
         * @param [in] [newPwd] [新密码]
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         * @exception/throws VerifyCodeException 验证码异常（超时、错误等情况）
         * @exception/throws PwdException 密码异常（位数不够，复杂性不满足等情况）
         */
        void resetPassword(string phoneNumber, string newPwd, string verifyCode) 
        throws cusexception::DatabaseException, cusexception::AccountException, cusexception::VerifyCodeException, cusexception::PwdException, cusexception::NumberFormatException;
        
        
        /**
         * 登出服务器(不管token是否有效都会正常返回)
         * @param [in] [token] [登陆标记]
         * @exception/throws DatabaseException 数据访问异常
         */
        void logout(string token) throws cusexception::DatabaseException;

        /**
         * 添加gps记录
         * @param [in] [token] [登陆令牌]
         * @param [in] [records] [GPS记录]
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         */
        void addRecords(string token,records recordList) throws cusexception::DatabaseException, cusexception::AccountException;

        /**
         * 添加gps记录
         * @param [in] [token] [登陆令牌]
         * @param [in] [records] [GPS记录]
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         */
         void addRecordsPB(string token,RecordListPB recordList) throws cusexception::DatabaseException, cusexception::AccountException;

        /**
         * 添加gps记录
         * @param [in] [token] [登陆令牌]
         * @param [in] [records] [GPS记录]
         * @return [out] 是否重新加载地图信息
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         */
         bool addRecordsPbV2(string token,RecordListPB recordList) throws cusexception::DatabaseException, cusexception::AccountException;
        
        /**
         * 上传当前GPS位置，并会把记录返回给远程控制方
         * @param [in] [token] [登陆令牌]    
         * @param [in] [record] [GPS记录]
         * @param [in] [messageId] [uuid] protobuf ActionMessage.proto中ControlM定义的消息id，被调用方收到消息进行操作，操作完成用messageId确认
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         */
        void uploadCurrentLocation(string token,databean::Record record, string messageId)
         throws cusexception::DatabaseException, cusexception::AccountException, cusexception::ParamWrongException;

         /**
         * 上传当前GPS位置，并会把记录返回给远程控制方
         * @param [in] [token] [登陆令牌]
         * @param [in] [record] [GPS记录] RecordPB封装
         * @param [in] [messageId] [uuid] protobuf ActionMessage.proto中ControlM定义的消息id，被调用方收到消息进行操作，操作完成用messageId确认
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         */
        void uploadCurrentLocationPB(string token,RecordPB record, string messageId)
         throws cusexception::DatabaseException, cusexception::AccountException, cusexception::ParamWrongException;
        /**
         * 上传当前GPS位置，并会把记录返回给远程控制方
         * @param [in] [token] [登陆令牌]
         * @param [in] [record] [GPS记录] RecordPB封装
         * @param [in] [messageId] [uuid] protobuf ActionMessage.proto中ControlM定义的消息id，被调用方收到消息进行操作，操作完成用messageId确认
         * @return [out] 是否重新加载地图信息
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         */
        bool uploadCurrentLocationPbV2(string token,RecordPB record, string messageId)
         throws cusexception::DatabaseException, cusexception::AccountException, cusexception::ParamWrongException;


        /**
         * 获取是否允许上传行为记录以及时间间隔
         * @param [in] [token] [登陆令牌]  
         * @param [out] [interval] 输出时间间隔  
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         */
        bool getOpInfo(string token, out int interval) throws cusexception::DatabaseException, cusexception::AccountException;
        
        /**
         * 更新是否允许上传行为记录
         * @param [in] [token] [登陆令牌]    
         * @param [in] [isOpHistoryOn] 是否允许上传行为记录
         * @param [in] [interval] 时间间隔
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         */
        void updateOpHistoryOn(string token, bool isOpHistoryOn, int interval) throws cusexception::DatabaseException, cusexception::AccountException;
        
        /**
         * 获取是否允许上传行为记录以及时间间隔
         * @param [in] [token] [登陆令牌]  
         * @param [out] [interval] 输出时间间隔  
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         */
        bool getRemoteOpInfo(string token, string phonenum, out int interval) throws cusexception::DatabaseException, cusexception::AccountException;
        
        /**
         * 更新是否允许上传行为记录
         * @param [in] [token] [登陆令牌]    
         * @param [in] [isOpHistoryOn] 是否允许上传行为记录
         * @param [in] [interval] 时间间隔
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         */
        void updateRemoteOpHistoryOn(string token, string phonenum, bool isOpHistoryOn, int interval) throws cusexception::DatabaseException, cusexception::AccountException;
                  
        /**
         * 获取当前时间
         */
        long getCurrentTime();
        
        /**
         * 获取指定时间范围内的记录
         * @param [in] [token] [登陆令牌]
         * @param [in] [starttime] [开始时间，从1970年1月1日开始到取得系统时间为止所经过的毫秒数]
         * @param [in] [endtime] [结束时间]
         * @return [records] 记录list，没有记录的话返回空的数组
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         */
        records getRecords(string token, long starttime, long endtime) throws cusexception::DatabaseException, cusexception::AccountException;
        
        /**
         * 获取指定时间范围内的记录
         * @param [in] [token] [登陆令牌]
         * @param [in] [starttime] [开始时间，从1970年1月1日开始到取得系统时间为止所经过的毫秒数]
         * @param [in] [endtime] [结束时间]
         * @return [records] 记录list，用Protobuf类RecordListPB封装
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         */
        RecordListPB getRecordsPB(string token, long starttime, long endtime) throws cusexception::DatabaseException, cusexception::AccountException;

        /**
         * 获取指定的关注号码指定时间范围内的记录
         * @param [in] [token] [登陆令牌]
         * @param [in] [phoneNum] [对方电话号码]只能是关注的号码，不然抛AuthException异常
         * @param [in] [starttime] [开始时间，从1970年1月1日开始到取得系统时间为止所经过的毫秒数]
         * @param [in] [endtime] [结束时间]
         * @return [records] 记录list，没有记录的话返回空的数组
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 
         * @exception/throws AuthException 权限异常，对方不在你的关注号码中
         */
        records getRemoteRecords(string token, string phoneNum, long starttime, long endtime) 
        throws cusexception::DatabaseException, cusexception::AccountException, cusexception::AuthException;
        
        /**
         * 获取指定的关注号码指定时间范围内的记录
         * @param [in] [token] [登陆令牌]
         * @param [in] [phoneNum] [对方电话号码]只能是关注的号码，不然抛AuthException异常
         * @param [in] [starttime] [开始时间，从1970年1月1日开始到取得系统时间为止所经过的毫秒数]
         * @param [in] [endtime] [结束时间]
         * @return [records] 记录list，用Protobuf类RecordListPB封装
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException
         * @exception/throws AuthException 权限异常，对方不在你的关注号码中
         */
        RecordListPB getRemoteRecordsPB(string token, string phoneNum, long starttime, long endtime)
        throws cusexception::DatabaseException, cusexception::AccountException, cusexception::AuthException;

        /**
         * 获取指定设备的最后一条记录
         * @param [in] [token] [登陆令牌]
         * @return [Record] 记录,如果一条记录也没有返回null
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         */
        databean::Record getLastRecord(string token) throws cusexception::DatabaseException, cusexception::AccountException;
        
        /**
         * 获取指定设备的最后一条记录
         * @param [in] [token] [登陆令牌]
         * @return [bytearray] 记录,用Protobuf类RecordPB封装,如果一条记录也没有返回null
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         */
        RecordPB getLastRecordPB(string token) throws cusexception::DatabaseException, cusexception::AccountException;

        /**
         * 获取指定的关注号码的最后一条记录
         * @param [in] [token] [登陆令牌]
         * @param [in] [phoneNum] [对方电话号码]只能是关注的号码，不然抛AuthException异常
         * @return [Record] 记录,如果一条记录也没有返回null
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         * @exception/throws AuthException 权限异常，对方不在你的关注号码中
         */
        databean::Record getRemoteLastRecord(string token, string phoneNum) 
        throws cusexception::DatabaseException, cusexception::AccountException, cusexception::AuthException;
        
        /**
         * 获取指定的关注号码的最后一条记录
         * @param [in] [token] [登陆令牌]
         * @param [in] [phoneNum] [对方电话号码]只能是关注的号码，不然抛AuthException异常
         * @return [Record] 记录,用Protobuf类RecordPB封装,如果一条记录也没有返回null
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         * @exception/throws AuthException 权限异常，对方不在你的关注号码中
         */
        RecordPB getRemoteLastRecordPB(string token, string phoneNum)
        throws cusexception::DatabaseException, cusexception::AccountException, cusexception::AuthException;

        /**
         * 获取所有的栅栏
         * @param [in] [token] [登陆令牌]
         * @return [fence] 栅栏list
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         */
        fences getFences(string token) throws cusexception::DatabaseException, cusexception::AccountException;
        
        /**
         * 获取指定的关注号码所有的栅栏
         * @param [in] [token] [登陆令牌]
         * @param [in] [phoneNum] [对方电话号码]只能是关注的号码，不然抛AuthException异常
         * @return [fence] 栅栏list
         * @exception/throws AccountException token失效需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         * @exception/throws AuthException 权限异常，对方不在你的关注号码中
         */
        fences getRemoteFences(string token, string phoneNum) 
        throws cusexception::DatabaseException, cusexception::AccountException, cusexception::AuthException;
        
        /**
         * 更新栅栏,通过fence的id字段找到数据库中的栅栏数据，其他字段进行更新
         * @param [in] [token] [登陆令牌]
         * @param [in] [fence] 栅栏
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         */
        void updateFence(string token, databean::Fence fence) throws cusexception::DatabaseException, cusexception::AccountException;
        
        /**
         * 更新指定的关注号码的栅栏,通过fence的id字段找到数据库中的栅栏数据，其他字段进行更新
         * @param [in] [token] [登陆令牌]
         * @param [in] [phoneNum] [对方电话号码]只能是关注的号码，不然抛AuthException异常
         * @param [in] [fence] 栅栏
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         * @exception/throws AuthException 权限异常，对方不在你的关注号码中
         */
        void updateRemoteFence(string token, string phoneNum, databean::Fence fence) 
        throws cusexception::DatabaseException, cusexception::AccountException, cusexception::AuthException;
        
        /**
         * 添加栅栏,fence的id字段应为空
         * @param [in] [token] [登陆令牌]
         * @param [in] [fence] 栅栏
         * @return [string] 记录在数据库中的id
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         */
        string insertFence(string token, databean::Fence fence) throws cusexception::DatabaseException, cusexception::AccountException;
        
        /**
         * 添加指定的关注号码的栅栏,fence的id字段应为空
         * @param [in] [token] [登陆令牌]
         * @param [in] [phoneNum] [对方电话号码]只能是关注的号码，不然抛AuthException异常
         * @param [in] [fence] 栅栏
         * @return [string] 记录在数据库中的id
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         * @exception/throws AuthException 权限异常，对方不在你的关注号码中
         */
        string insertRemoteFence(string token, string phoneNum, databean::Fence fence) 
        throws cusexception::DatabaseException, cusexception::AccountException, cusexception::AuthException;
        
         /**
         * 通过fence的id字段删除栅栏
         * @param [in] [token] [登陆令牌]
         * @param [in] [fence] 栅栏
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         */
        void deleteFence(string token, string id) throws cusexception::DatabaseException, cusexception::AccountException;
        
        /**
         * 通过fence的id字段删除指定的关注号码的栅栏
         * @param [in] [token] [登陆令牌]
         * @param [in] [phoneNum] [对方电话号码]只能是关注的号码，不然抛AuthException异常
         * @param [in] [fence] 栅栏
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         * @exception/throws AuthException 权限异常，对方不在你的关注号码中
         */
        void deleteRemoteFence(string token, string phoneNum, string id) 
        throws cusexception::DatabaseException, cusexception::AccountException, cusexception::AuthException;
                
        /**
         * 更新设备信息
         * @param [in] [token] [登陆令牌]
         * @param [in] [databean::Device] 设备信息,不是枚举变量指定的字段不用设值,设了也无效
         * @param [in] [actionType] 操作类型枚举值
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         * @exception/throws ParamWrongException actionType的枚举值是不支持的类型
         */
        databean::Device updateDeviceinfo(string token, databean::Device info, databean::ACTIONTYPE actionType) throws cusexception::DatabaseException, cusexception::AccountException, cusexception::ParamWrongException;
        
        /**
         * 更新指定的关注号码设备信息
         * @param [in] [token] [登陆令牌]
         * @param [in] [phoneNum] [对方电话号码]只能是关注的号码，不然抛AuthException异常
         * @param [in] [databean::Device] 设备信息,不是枚举变量指定的字段不用设值,设了也无效
         * @param [in] [actionType] 操作类型枚举值
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         * @exception/throws ParamWrongException actionType的枚举值是不支持的类型
         * @exception/throws AuthException 权限异常，对方不在你的关注号码中
         */
        databean::Device updateRemoteDeviceinfo(string token, string phoneNum, databean::Device info, databean::REMOTEACTIONTYPE actionType)
        throws cusexception::DatabaseException, cusexception::AccountException, cusexception::ParamWrongException, cusexception::AuthException;

        void updateRemoteDevice(string token, string phone, string key, string value)  throws cusexception::AccountException;
        
        /**
         * 取得设备信息
         * @param [in] [token] [登陆令牌]
         * @return [databean::Device] 设备信息
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         */
        databean::Device getDeviceinfo(string token) throws cusexception::DatabaseException, cusexception::AccountException;
        
        /**
         * 取得指定的关注号码设备信息
         * @param [in] [token] [登陆令牌]
         * @param [int] [phoneNum] [对方电话号码]只能是关注的号码，不然抛AuthException异常
         * @param [out] [isOnline] [对方电话号码]是否在线
         * @return [databean::Device] 设备信息
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         * @exception/throws AuthException 权限异常，对方不在你的关注号码中
         */
        databean::Device getRemoteDeviceinfo(string token, string phoneNum, out bool isOnline) 
        throws cusexception::DatabaseException, cusexception::AccountException, cusexception::AuthException;
        
        /**
         * 取得指定的关注号码设备版本
         * @param [in] [token] [登陆令牌]
         * @param [int] [phoneNum] [对方电话号码]只能是关注的号码，不然抛AuthException异常
         * @return [string] 版本号
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         * @exception/throws AuthException 权限异常，对方不在你的关注号码中
         */
        string getRemoteDeviceVersion(string token, string phoneNum) 
        throws cusexception::DatabaseException, cusexception::AccountException, cusexception::AuthException;

         /**
          * 取得指定的关注号码设备版本
          * @param [in] [token] [登陆令牌]
          * @param [int] [phoneNum] [对方电话号码]只能是关注的号码，不然抛AuthException异常
          * @out [string] 详细信息（关爱，普通）
          * @return [string] 版本号
          * @exception/throws AccountException token失效，需重新登陆
          * @exception/throws DatabaseException 数据访问异常
          * @exception/throws AuthException 权限异常，对方不在你的关注号码中
          */
         string getRemoteDeviceVersionV2(string token, string phoneNum, out string detail)
         throws cusexception::DatabaseException, cusexception::AccountException, cusexception::AuthException;
        
        /**
         * 取得设备限制状态,包含是否VIP，VIP时限，剩余短信数、剩余空间大小
         * @param [in] [token] [登陆令牌]
         * @return [databean::DeviceLimit] 设备限制信息
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         */
        databean::DeviceLimit getDeviceLimit(string token) throws cusexception::DatabaseException, cusexception::AccountException;

        /**
         * 取得可选权限状态
         * @param [in] [token] [登陆令牌]
         * @return [databean::DeviceLimit] 设备限制信息
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         */
        priorityMap getDeviceOptionalPriorityMap(string token) throws cusexception::DatabaseException, cusexception::AccountException;

        /**
         * 取得可选权限状态
         * @param [in] [token] [登陆令牌]
         * @return [databean::DeviceLimit] 设备限制信息
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         */
        priorityMap getRemoteDeviceOptionalPriorityMap(string token, string phone) throws cusexception::DatabaseException, cusexception::AccountException;

        /**
         * 取得设备限制状态,包含是否VIP，VIP时限，剩余短信数、剩余空间大小
         * @param [in] [token] [登陆令牌]
         * @return [byte[]] 设备限制信息
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         */
        bytearray getDeviceLimitPB(string token) throws cusexception::DatabaseException, cusexception::AccountException;
        
        /**
         * 取得指定的关注号码设备限制状态,包含是否VIP，VIP时限，剩余短信数、剩余空间大小
         * @param [in] [token] [登陆令牌]
         * @param [int] [phoneNum] [对方电话号码]只能是关注的号码，不然抛AuthException异常
         * @return [byte[]] 设备限制信息
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         * @exception/throws AuthException 权限异常，对方不在你的关注号码中
         */
        bytearray getRemoteDeviceLimitPB(string token, string phoneNum)
        throws cusexception::DatabaseException, cusexception::AccountException, cusexception::AuthException;

        /**
         * 取得指定的关注号码设备限制状态,包含是否VIP，VIP时限，剩余短信数、剩余空间大小
         * @param [in] [token] [登陆令牌]
         * @param [int] [phoneNum] [对方电话号码]只能是关注的号码，不然抛AuthException异常
         * @return [databean::DeviceLimit] 设备限制信息
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         * @exception/throws AuthException 权限异常，对方不在你的关注号码中
         */
        databean::DeviceLimit getRemoteDeviceLimit(string token, string phoneNum)
        throws cusexception::DatabaseException, cusexception::AccountException, cusexception::AuthException;

        /**
         * 获取按时间倒序排列的设备消息
         * @param [in] [token] [登陆令牌]
         * @param [int] [time] [消息的截止时间]
         * @param [int] [num] [获取消息条数]
         * @param [in] [type] [消息类型，远程、本地]
         * @return [fence] 消息列表
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         */
        messages getDeviceMessages(string token, long time, int num, databean::MESSAGETYPE type)
         throws cusexception::DatabaseException, cusexception::AccountException;
         
         /**
         * 删除指定的定位分享
         * @param [in] [token] [登陆令牌]
         * @param [in] [PositionURLId] [截止时间]
         * @param [int] [num] [获取记录条数]
         * @return [records] 记录列表
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         */
        void deletePositionOfURL(string token, string PositionURLId)
         throws cusexception::AuthException, cusexception::AccountException;
         
         /**
         * 获取按时间倒序排列的指定的定位分享获得的定位信息
         * @param [in] [token] [登陆令牌]
         * @param [int] [time] [截止时间]
         * @param [int] [num] [获取记录条数]
         * @return [puRecords] 记录列表
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         */
         puRecords getPositionListOfURL(string token, string positionURLId, long time, int num)
         throws cusexception::AuthException, cusexception::AccountException;
         
         /**
         * 获取按时间倒序排列的用户操作记录
         * @param [in] [token] [登陆令牌]
         * @param [int] [phoneNum] [对方电话号码]只能是关注的号码，不然抛AuthException异常
         * @param [int] [time] [截止时间]
         * @param [int] [num] [获取记录条数]
         * @return [opHistory] 记录列表
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws AuthException 权限异常
         */
         opHistory getOpHistory(string token, string phoneNum, long time, int num)
         throws cusexception::AuthException, cusexception::AccountException;
         
         /**
         * 批量添加用户操作记录
         * @param [in] [token] [登陆令牌]
         * @param [int] [opList] [用户操作记录]
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws AuthException 权限异常
         */
         void addOpHistory(string token, opHistory opList)
         throws cusexception::AuthException, cusexception::AccountException;
         
         /**
         * 删除指定的设备消息
         * @param [in] [token] [登陆令牌]
         * @param [in] [messageId] [消息ID，为空或null时表示删除全部]
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         */
        void deleteDeviceMessage(string token, string messageId)
         throws cusexception::DatabaseException, cusexception::AccountException;
         
        
        /**
         * 获取按时间倒序排列的远程手机电量报警消息
         * @param [in] [token] [登陆令牌]
         * @param [int] [phoneNum] [对方电话号码]只能是关注的号码，不然抛AuthException异常
         * @param [int] [time] [消息的截止时间]
         * @param [int] [num] [获取消息条数]
         * @return [fence] 消息列表
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         */
        alerts getRemoteDevicePowerAlerts(string token, string phoneNum, long time, int num)
         throws cusexception::DatabaseException, cusexception::AccountException, cusexception::AuthException;
        
                /**
         * 获取按时间倒序排列的远程手机栅栏报警消息
         * @param [in] [token] [登陆令牌]
         * @param [int] [phoneNum] [对方电话号码]只能是关注的号码，不然抛AuthException异常
         * @param [int] [time] [消息的截止时间]
         * @param [int] [num] [获取消息条数]
         * @return [fence] 消息列表
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         */
        alerts getRemoteDevicFenceAlerts(string token, string phoneNum, long time, int num, string fenceId)
         throws cusexception::DatabaseException, cusexception::AccountException, cusexception::AuthException;
         
        /**
         * 获取关注的手机号的最后一条报警
         * @param [in] [token] [登陆令牌]
         * @param [int] [phoneNum] [对方电话号码]只能是关注的号码，不然抛AuthException异常
         * @return [DeviceAlert] 报警信息，如果没有返回null
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         * @exception/throws AuthException 权限异常，对方不在你的关注号码中
         */
        databean::DeviceAlert getRemoteLastAlert(string token, string number) 
        throws cusexception::DatabaseException, cusexception::AccountException, cusexception::AuthException;

        /**
         * 获取关注的手机号的最后一条微信录屏或电话录音信息
         * @param [in] [token] [登陆令牌]
         * @param [int] [phoneNum] [对方电话号码]只能是关注的号码，不然抛AuthException异常
         * @return [filePB] 文件信息，如果没有返回null
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         * @exception/throws AuthException 权限异常，对方不在你的关注号码中
         */
        filePB getRemoteLastFile(string token, string number)
        throws cusexception::DatabaseException, cusexception::AccountException, cusexception::AuthException;
        
         /**
         * 获取指定报警信息id的远程手机的报警
         * @param [in] [token] [登陆令牌]
         * @param [int] [phoneNum] [对方电话号码]只能是关注的号码，不然抛AuthException异常
         * @param [int] [deviceAlertId] 报警信息id
         * @return [DeviceAlert] 报警信息，如果没有返回null
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         * @exception/throws AuthException 权限异常，对方不在你的关注号码中
         */
        databean::DeviceAlert getRemoteAlert(string token, string phoneNum, string deviceAlertId) 
        throws cusexception::DatabaseException, cusexception::AccountException, cusexception::AuthException;
        
        
        /**
         * 向对方手机发送控制信息
         * @param [in] [token] [登陆令牌]
         * @param [int] [phoneNum] [对方电话号码]只能是关注的号码，不然抛AuthException异常
         * @param [int] [actionType] [操作类型枚举值] 使用com.push.message.ActionEnum这个protobuf类
         * @return [string] messageId,表示此次操作的唯一ID
         * @exception/throws AccountException token失效需重新登陆 
         * @exception/throws AuthException 权限不够，需要升级账号
         * @exception/throws OffLineException 对方不在线
         * @exception/throws DatabaseException 目标号码不是关注号码
         */
        ["ami", "amd"] string doAction(string token, string phoneNum, int actionType) 
        throws cusexception::AccountException,cusexception::AuthException,cusexception::OffLineException, cusexception::DatabaseException, cusexception::QuotaException;
        
        /**
         * 向对方手机发送控制信息
         * @param [in] [token] [登陆令牌]
         * @param [int] [phoneNum] [对方电话号码]只能是关注的号码，不然抛AuthException异常
         * @param [int] [actionType] [操作类型枚举值] 使用com.push.message.ActionEnum这个protobuf类
         * @param [int] [map] [额外参数]
         * @return [string] messageId,表示此次操作的唯一ID
         * @exception/throws AccountException token失效需重新登陆 
         * @exception/throws AuthException 权限不够，需要升级账号
         * @exception/throws OffLineException 对方不在线
         * @exception/throws DatabaseException 目标号码不是关注号码
         */
        ["ami", "amd"] string doActionWithParam(string token, string phoneNum, int actionType, paramMap map) 
        throws cusexception::AccountException,cusexception::AuthException,cusexception::OffLineException, cusexception::DatabaseException, cusexception::QuotaException;

        /**
         *  被控主动向主控发送相应消息，必须与meeageId关联
         *  @param [in] [token] [登陆令牌]
         *  @param [in] [messageId] [相应的主控发过来的消息id]
         *  @param [in] [message] [消息字符串]
         * @exception/throws AccountException token失效需重新登陆
         * @exception/throws ParamWrongException 参数错误，messageId无效或message为空（message长度限制500字符）
         */
        void responseToMaster(string token, string messageId, string message) throws cusexception::AccountException, cusexception::ParamWrongException;

        /**
         *  被控主动向主控报告状态
         *  @param [in] [token] [登陆令牌]
         *  @param [in] [messageId] [相应的主控发过来的消息id]
         *  @param [in] [statuses] [<string,string>状态map, key为状态名称，value为状态值]
         * @exception/throws AccountException token失效需重新登陆
         * @exception/throws ParamWrongException 参数错误
         */
        void responseToMasterWithStatusResult(string token, string messageId, paramMap statuses) throws cusexception::AccountException, cusexception::ParamWrongException;

        paramMap getConfigMap(string token);

        paramMap getInitMap();

        /**
         * 验证阿里云一键注册
         * @param [in] [token] [阿里云一键登录sdk在手机生成的token]
         * @return [OneKeyRegistResult] 结果，包含手机号，是否成功，错误信息
         **/
        databean::OneKeyRegistResult oneKeyRegist(string token);
        
        
        /**
         * 向对方手机发送控制信息,只有清除隐私和删除应用类型才会被接受
         * @param [in] [token] [登陆令牌]
         * @param [int] [phoneNum] [对方电话号码]只能是关注的号码，不然抛AuthException异常
         * @param [int] [actionType] [操作类型枚举值] 使用com.push.message.ActionEnum这个protobuf类
         * @param [out] [errorMessage] [失败时返回错误信息] 返回true时errorMessage为空
         * @return [bool] 操作是否成功
         * @exception/throws AuthException 权限不够，需要升级账号
         * @exception/throws OffLineException 对方不在线
         * @exception/throws PwdException 密码错误
         */
        ["ami", "amd"] bool doActionWithoutLogin(string phoneNum, string passwd, int actionType, out string errorMessage) 
        throws cusexception::AuthException,cusexception::OffLineException,cusexception::PwdException;
        /**
         * 请求文件上传地址
         * @param [in] [token] [登陆令牌]
         * @param [in] [suffix] [文件后缀名]
         * @return [file] 文件对象，包含文件id和文件上传地址，使用http PUT上传
         * @exception/throws AccountException token失效需重新登陆 
         * @exception/throws ParamWrongException 后缀名不正确，不能有.
         */        
        databean::File allocateFile(string token, string suffix) throws cusexception::AccountException, cusexception::ParamWrongException;
                
        /**
         * 上传日志文件
         * @param [in] [token] [登陆令牌]
         * @param [in] [fileContent] [日志文件二进制流]
         * @param [in] [requestId] [UploadLog消息中的requestId字段]
         * @param [in] [finish] [true/false,为true表示最后一个上传的文件，只有不可再用同一个requesId上传]
         * @return [string] 下载的URL，使用http GET下载
         * @exception/throws AccountException token失效需重新登陆
         */  
        string upLoadLog(string token ,bytearray fileContent, string requestId, bool finish) throws cusexception::AccountException;
        /**
         * 主控上传被控文件
         * @param [in] [token] [登陆令牌]
         * @param [in] [fileId] [oss 文件id]
         * @param [in] [type] [文件类型，通话录音的值为ActionE.RECORDPHONETALK_VALUE]
         * @param [in] [metaInfo] [json类型的meta info]
         * @exception/throws AccountException token失效需重新登陆
         * @exception/throws QuotaException 空间不足异常
         * @exception/throws FilenotFoundException 文件不存在异常
         * @exception/throws AuthException 权限异常
         */
        void upLoadRemoteFile(string token ,string phone, string fileId, int type, string metaInfo)
        throws cusexception::AccountException, cusexception::QuotaException, cusexception::FilenotFoundException, cusexception::AuthException;

        /**
         * 上传文件
         * @param [in] [token] [登陆令牌]
         * @param [in] [fileId] [oss 文件id]
         * @param [in] [type] [文件类型，通话录音的值为ActionE.RECORDPHONETALK_VALUE]
         * @param [in] [metaInfo] [json类型的meta info]
         * @exception/throws AccountException token失效需重新登陆
         * @exception/throws QuotaException 空间不足异常
         * @exception/throws FilenotFoundException 文件不存在异常
         * @exception/throws AuthException 权限异常
         */
        void upLoadFile(string token ,string fileId, int type, string metaInfo)
        throws cusexception::AccountException, cusexception::QuotaException, cusexception::FilenotFoundException, cusexception::AuthException;
        
        /**
         * 上传日志文件
         * @param [in] [token] [登陆令牌]
         * @param [in] [fileContent] [日志文件二进制流]
         * @param [in] [fileContent] [fileContent中的有效长度]
         * @param [in] [requestId] [UploadLog消息中的requestId字段]
         * @param [in] [finish] [true/false,为true表示最后一个上传的文件，只有不可再用同一个requesId上传]
         * @return [string] 下载的URL，使用http GET下载
         * @exception/throws AccountException token失效需重新登陆
         */  
        string upLoadLogV2(string token ,bytearray fileContent, int len, string requestId, bool finish) throws cusexception::AccountException;

        
        /**
         * 强制登录
         * @param [in] [token] [登陆令牌]
         * @param [in] [dstNumber] [对方帐号]
         * @param [in] [password] [对方帐号密码]
         * @param [out] [errorMessage] [失败时返回错误信息] 返回true时errorMessage为空
         * @return [bool] 操作是否成功
         * @exception/throws AccountException token失效需重新登陆
         * @exception/throws AuthException 密码错误
         * @exception/throws OffLineException 对方不在线
         * @exception/throws ForceLoginException 强制登路异常（对方可能已经登录了新账号）
         */  
        ["ami", "amd"] bool forceLogin(string token, string dstNumber, string password, out string errorMessage) throws cusexception::AccountException,cusexception::AuthException
        ,cusexception::OffLineException ,cusexception::ForceLoginException;
        
        /**
         * 上传设备ID和推送
         * @param [in] [deviceIdentity] [设备]
         * @param [in] [tuisongId] [推送ID]
         */
        void uploadDeviceIdentityAndTuisongId(string deviceIdentity, string tuisongId);
        
        /**
         * 报告强制登录是否成功
         * @param [in] [token] [登陆令牌]
         * @param [in] [dstNumber] [对方帐号]
         * @param [in] [password] [对方帐号密码]
         * @return [string] 下载的URL，使用http GET下载
         * @exception/throws AccountException token失效需重新登陆
         * @exception/throws ParamWrongException requestId错误
         */  
        void reportLoginStatus(string requestId, bool success, string errorMessage) throws cusexception::AccountException,cusexception::ParamWrongException;
        
        /**
         * 根据文件id取得文件在阿里云的下载地址
         * @param [in] [token] [登陆令牌]
         * @param [in] [fileId] [文件id]
         * @return [string] 下载的URL，使用http GET下载
         * @exception/throws AccountException token失效需重新登陆
         * @exception/throw ParamWrongException 文件为空
         * @exception/throw QuotaException 下载流量超限
         */  
        string getFileOSSURL(string token, string fileId) throws cusexception::AccountException, cusexception::ParamWrongException, cusexception::QuotaException;
/**
         * 根据文件id取得缩略图在阿里云的下载地址
         * @param [in] [token] [登陆令牌]
         * @param [in] [fileId] [文件id]
         * @return [string] 下载的URL，使用http GET下载
         * @exception/throws AccountException token失效需重新登陆
         * @exception/throw ParamWrongException 文件为空
         * @exception/throw QuotaException 下载流量超限
         */
        string getPreviewFileOSSURL(string token, string fileId) throws cusexception::AccountException, cusexception::ParamWrongException, cusexception::QuotaException;
        
        /**
         * 根据图片id取得文件在阿里云的下载地址
         * @param [in] [token] [登陆令牌]
         * @param [in] [fileId] [文件id]
         * @return [string] 下载的URL，使用http GET下载
         * @exception/throws AccountException token失效需重新登陆
         * @exception/throw ParamWrongException 文件为空
         */  
        string getImageOSSURL(string token, string fileId) throws cusexception::AccountException, cusexception::ParamWrongException;
        
        
        /**
         * 根据文件id删除文件
         * @param [in] [token] [登陆令牌]
         * @param [int] [phoneNum] [对方电话号码]只能是关注的号码，不然抛AuthException异常
         * @param [in] [fileId] [文件id]
         * @exception/throws AccountException 1.token失效需重新登陆 或 2.目标号码不是关注号码
         * @exception/throws FilenotFoundException 文件不存在或者试图删除一个没有所有权的文件
         */  
        void deleteFile(string token, string phoneNum, string fileId)
         throws cusexception::AccountException, cusexception::FilenotFoundException, cusexception::AuthException;

       /**
         * 删除同一类型的所有文件
         * @param [in] [token] [登陆令牌]
         * @param [int] [phoneNum] [对方电话号码]只能是关注的号码，不然抛AuthException异常
         * @param [int] [actionType] [操作类型枚举值] 使用com.push.message.ActionEnum这个protobuf类,-1表示所有类型
         * @exception/throws AccountException 1.token失效需重新登陆 或 2.目标号码不是关注号码
         */  
        void deleteFiles(string token, string phoneNum,  int actionType)
         throws cusexception::AccountException, cusexception::AuthException;

       /**
         * 上传错误日志
         * @param [in] [token] [登陆令牌]
         * @param [in] [time] [错误发生的时间戳]
         * @param [in] [log] [错误日志]
         * @exception/throws AccountException 1.token失效需重新登陆 或 2.目标号码不是关注号码
         */  
        void uploadErrorLog(string token, long time, string log)
         throws cusexception::AccountException;

        /**
         * 取得之前上传的照片、录像、通讯录、短信等文件,以endTime截止，返回num条数据，时间顺序倒排
         * @param [in] [token] [登陆令牌]
         * @param [int] [phoneNum] [对方电话号码]只能是关注的号码，不然抛AuthException异常
         * @param [int] [actionType] [操作类型枚举值] 使用com.push.message.ActionEnum这个protobuf类
         * @return [fileList] 文件列表
         * @exception/throws AccountException token失效需重新登陆或目标号码不是关注号码
         * @exception/throws DatabaseException 目标号码不是关注号码  
         */  
        fileList getFileList(string token, string phoneNum, int actionType, long endTime, int num) 
        throws cusexception::AccountException, cusexception::DatabaseException, cusexception::AuthException;

        /**
         * 取得之前上传的照片、录像、通讯录、短信等文件,以endTime截止，返回num条数据，时间顺序倒排
         * @param [in] [token] [登陆令牌]
         * @param [int] [phoneNum] [对方电话号码]只能是关注的号码，不然抛AuthException异常
         * @param [int] [actionType] [操作类型枚举值] 使用com.push.message.ActionEnum这个protobuf类
         * @return [fileList] 文件列表
         * @exception/throws AccountException token失效需重新登陆或目标号码不是关注号码
         * @exception/throws DatabaseException 目标号码不是关注号码
         */
        filePBList getFileListPB(string token, string phoneNum, int actionType, long endTime, int num)
        throws cusexception::AccountException, cusexception::DatabaseException, cusexception::AuthException;

        /**
         * 取得之前上传的照片、录像、通讯录、短信等文件数量
         * @param [in] [token] [登陆令牌]
         * @param [int] [phoneNum] [对方电话号码]只能是关注的号码，不然抛AuthException异常
         * @param [int] [actionType] [操作类型枚举值] 使用com.push.message.ActionEnum这个protobuf类
         * @return [fileList] 文件列表
         * @exception/throws AccountException token失效需重新登陆或
         * @exception/throws DatabaseException 目标号码不是关注号码
         */  
        int getFileCount(string token, string phoneNum, int actionType)
         throws cusexception::AccountException, cusexception::DatabaseException, cusexception::AuthException;

       /**
         * 给设备添加配置项，key/value都是字符串类型，已存在的key会被覆盖
         * @param [in] [token] [登陆令牌]
         * @param [in] [key] 设置项key
         * @param [in] [value] 设置项值
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         * @exception/throws ParamWrongException key或value不符合要求（不能为空)
         * @exception/throws AuthException 权限不足
         */
        void addConfigToDevice(string token, string key, string value) throws cusexception::DatabaseException, cusexception::AccountException, cusexception::ParamWrongException, cusexception::AuthException;

        /**
         * 给设备添加配置项，key/value都是字符串类型，已存在的key会被覆盖
         * @param [in] [token] [登陆令牌]
         * @param [in] [phone] 被关注的手机号
         * @param [in] [key] 设置项key
         * @param [in] [value] 设置项值
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         * @exception/throws ParamWrongException key或value不符合要求（不能为空)
         * @exception/throws AuthException 权限不足
         */
        void addConfigToRemoteDevice(string token, string phone, string key, string value) throws cusexception::DatabaseException, cusexception::AccountException, cusexception::ParamWrongException, cusexception::AuthException;

       /**
         * 获取设备的配置项值，不存在会返回null
         * @param [in] [token] [登陆令牌]
         * @param [in] [phone] 目标账户，必须是已关注账户
         * @param [in] [key] 设置项key
         * @return [in] [string] 配置项值（字符串类型）
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         * @exception/throws ParamWrongException key或value不符合要求（不能为空)
         */
        string getRemoteDeviceConfig(string token, string phone, string key) throws cusexception::DatabaseException, cusexception::AccountException, cusexception::ParamWrongException;

        /**
         * 获取设备的所有配置项值，不存在会返回空map
         * @param [in] [token] [登陆令牌]
         * @param [in] [phone] 目标账户，必须是已关注账户
         * @param [in] [key] 设置项key
         * @return [in] [string] 配置项值（字符串类型）
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         * @exception/throws ParamWrongException key或value不符合要求（不能为空)
         */
        paramMap getRemoteDeviceConfigMap(string token, string phone) throws cusexception::DatabaseException, cusexception::AccountException, cusexception::ParamWrongException;
        /**
         * 获取设备的所有配置项值，不存在会返回空map
         * @param [in] [token] [登陆令牌]
         * @param [in] [phone] 目标账户，必须是已关注账户
         * @param [in] [key] 设置项key
         * @return [in] [string] 配置项值（字符串类型）
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         * @exception/throws ParamWrongException key或value不符合要求（不能为空)
         */
        paramMap getDeviceConfigMap(string token) throws cusexception::DatabaseException, cusexception::AccountException, cusexception::ParamWrongException;

        /**
         * 对控制消息进行响应，服务器根据响应推送消息给调用方，让调用方知道之前的调用已经成功，并取得需要的数据
         * @param [in] [token] [登陆令牌]
         * @param [in] [messageId] [uuid] protobuf ActionMessage.proto中ControlM定义的消息id，被调用方收到消息进行操作，操作完成用messageId确认
         * @param [in] [fileId] [文件id] doaction控制生成的相应文件id
         * @param [in] [itemNum] [元素数量] 通讯录、短信、通话记录等的数量,其他情况无效
         * @param [in] [status] [操作结果，true表示成功，false表示失败]
         * @param [in] [errorMessage] [操作结果失败时提供具体的错误信息]
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws QuotaException 磁盘限额超过异常
         * @exception/throws FilenotFoundException 文件不存在异常 
         */
        void actionComplete(string token, string messageId, string fileId, int itemNum, bool status, string errorMessage) 
        throws cusexception::AccountException, cusexception::QuotaException, cusexception::FilenotFoundException, cusexception::ParamWrongException, cusexception::AuthException;
        
        /**
         * 对挂失的控制消息进行确认（客户端完成删除隐私或者app后）
         * @param [in] [token] [登陆令牌]
         * @param [in] [messageId] [uuid] protobuf ActionMessage.proto中ControlM定义的消息id，被调用方收到消息进行操作，操作完成用messageId确认
         * @param [in] [itemNum] [元素数量] 通讯录、短信、通话记录等的数量,其他情况无效
         * @param [in] [status] [操作结果，true表示成功，false表示失败]
         * @param [in] [errorMessage] [操作结果失败时提供具体的错误信息]
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws ParamWrongException messageId无效 
         */
        void guashiActionComplete(string token, string messageId, bool status, string errorMessage) 
        throws cusexception::AccountException,  cusexception::ParamWrongException;
        
         /**
         * 对控制消息进行确认
         * @param [in] [token] [登陆令牌]
         * @param [in] [messageId] [uuid] protobuf ActionMessage.proto中ControlM定义的消息id，被调用方收到消息进行操作，操作完成用messageId确认
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws ParamWrongException messageId参数错误
         */
        void actionConfirm(string token, string messageId) 
        throws cusexception::AccountException, cusexception::ParamWrongException;

        /**
         * 用户广告点击确认，增加一次点击次数
         * @param [in] [token] [登陆令牌]
         * @exception/throws AccountException token失效，需重新登陆
         */
        void advertisementClickConfirm(string token)
        throws cusexception::AccountException;

       /**
         * 获取用户点击广告总数
         * @param [in] [token] [登陆令牌]
         * @exception/throws AccountException token失效，需重新登陆
         */
        int getAdvertisementClickCount(string token)
        throws cusexception::AccountException;

        /**
          * 用户使用广告点数兑换VIP或高级VIP
          * @param [in] [token] [登陆令牌]
          * @param [in] [days] [想要兑换的天数]
          * @param [in] [VIPENUMVALUE] [VIP或高级VIP的枚举值， PriorityE.VIP PriorityE.VIPPLUS]
          * @param [out] [string] [失败时返回错误原因]
          * @return [bool] 成功或失败
          * @exception/throws AccountException token失效，需重新登陆
          * @exception/throws ParamWrongException 用户的广告天数不足以兑换
          */
         bool updateAccountByAdvertisementClick(string token, int days, int VIPENUMVALUE, out string errormesssage)
         throws cusexception::AccountException, cusexception::ParamWrongException;

        /**
          * 用户使用广告点数给关注号码兑换VIP或高级VIP
          * @param [in] [token] [登陆令牌]
          * @param [in] [phone] [兑换的目标账户，必须是被关注的号码]
          * @param [in] [days] [想要兑换的天数]
          * @param [in] [VIPENUMVALUE] [VIP或高级VIP的枚举值， PriorityE.VIP PriorityE.VIPPLUS]
          * @param [out] [string] [失败时返回错误原因]
          * @return [bool] 成功或失败
          * @exception/throws AccountException token失效，需重新登陆
          * @exception/throws ParamWrongException 用户的广告天数不足以兑换
          */
         bool updateOtherAccountByAdvertisementClick(string token, string phone, int days, int VIPENUMVALUE, out string errormesssage)
         throws cusexception::AccountException, cusexception::ParamWrongException, cusexception::AuthException;

        /**Remote
         * 取得版本信息
         * @return [VersionInfo] 版本信息
         * @exception/throws AccountException
         */
        databean::VersionInfo getVersionInfo();

        /**
         * 取得版本信息
         * @return [VersionInfo] 版本信息
         * @exception/throws AccountException
         */
        databean::VersionInfo getVersionInfoForNewPkg();
        /**
         * 取得版本信息
         * @return [VersionInfo] 版本信息
         * @exception/throws AccountException
         */
        databean::VersionInfo getVersionInfoV2(string clientVersion);

        /**
         * 取得套餐列表
         * @param [in] [token] [登陆令牌]
         * @return [offerList] 套餐列表
         * @exception/throws AccountException token失效需重新登陆
         * @exception/throws DatabaseException 数据访问异常 
         */  
        offerList getOfferList(string token) 
        throws cusexception::AccountException, cusexception::DatabaseException;

         /**
          * 取得地图信息
          * @param [in] [token] [登陆令牌]
          * @param [in] [packageName] [包名]
          * @return [string] 地图信息
          * @exception/throws AccountException token失效需重新登陆
          */
         string getMapAccountInfo(string token, string packageName) throws cusexception::AccountException;

        /**
         * 取得定位分享套餐列表
         * @param [in] [token] [登陆令牌]
         * @return [posOffers] 套餐列表
         * @exception/throws DatabaseException 数据访问异常
         */
        posOffers getPosOfferList()
        throws cusexception::DatabaseException;

        /**
         * 取得微信录屏套餐列表
         * @param [in] [token] [登陆令牌]
         * @return [string] 套餐(json格式）
         * @exception/throws DatabaseException 数据访问异常
         */
        string getOptionalOfferList()
        throws cusexception::DatabaseException;

         /**
          * 上传地图调用次数
          * @param [in] [token] [登陆令牌]
          * @param [in] [id] [地图账户id]
          * @param [in] [start] [统计开始时间]
          * @param [in] [end] [统计结束时间]
          * @param [in] [count] [调用次数]
          * @exception/throws AccountException token失效需重新登陆
          * @exception/throws DatabaseException 数据访问异常
          */
         void reportMapCallCount(string token, string id, long start,long end, int count)
         throws cusexception::AccountException, cusexception::DatabaseException;

        /**
         * 请求生成订单id
         * @param [in] [token] [登陆令牌]
         * @param [in] [offerId] [套餐id] 当只购买短信时offerid为空字符串或null
         * @param [in] [smsCount] [短信数量] 额外购买的短信数量，套餐本身的短信数不包含在内
         * @param [in] [posMonth] [定位分享月数] 定位分享的月数
         * @param [in] [totalPrice] [总价]
         * @param [in] [phoneNum] [要购买套餐的电话,可以是自己，也可以是别人]
         * @return [string] 订单id
         * @exception/throws AccountException token失效需重新登陆
         * @exception/throws DatabaseException 指定的电话号码已经是终身套餐，只能购买短信
         * @exception/throws ParamWrongException 客户端上传的总价与服务器计算的总价不符 
         */  
        string gernerateOrder(string token, string offerId, int smsCount, string posOfferId, long totalPrice, string phoneNum) 
        throws cusexception::AccountException, cusexception::DatabaseException, cusexception::ParamWrongException;

        /**
         * 请求生成同屏订单id
         * @param [in] [token] [登陆令牌]
         * @param [in] [tongPingOfferId] [套餐id] 单独购买同屏分钟数
         * @param [in] [totalPrice] [总价]
         * @param [in] [phoneNum] [要购买套餐的电话,可以是自己，也可以是别人]
         * @return [string] 订单id
         * @exception/throws AccountException token失效需重新登陆
         * @exception/throws DatabaseException 指定的电话号码已经是终身套餐，只能购买短信
         * @exception/throws ParamWrongException 客户端上传的总价与服务器计算的总价不符
         */
        string gernerateTongPingOrder(string token, string tongPingOfferId, long totalPrice, string phoneNum)
        throws cusexception::AccountException, cusexception::DatabaseException, cusexception::ParamWrongException;

        /**
         * 给系统指定的号码发送短信验证码
         */
        void gernerateVerifyCode();
        
         /**
         * 发送强制上线短信
         */
        void sendForceOnlineSMS(string token, string targetPhoneNum) throws cusexception::AccountException, cusexception::AuthException;
        
        /**
         * 通过授权码给帐户升级
         * @param [in] [token] [登陆令牌]
         * @param [in] [authCode] [授权码] 授权码
         * @param [in] [phoneNum] [要购买套餐的电话,可以是自己，也可以是别人]
         
         * @return [DeviceLimit] 返回设备新的权限信息，同时会给该设备发送DeviceUpdate的推送消息
         * @exception/throws AccountException token失效需重新登陆
         * @exception/throws DatabaseException 授权码错误或已失效
         * @exception/throws ParamWrongException 电话号码格式错误或未注册 
         */  
        databean::DeviceLimit updateAccountByAuthCode(string token, string authCode, string phoneNum) 
        throws cusexception::AccountException, cusexception::DatabaseException, cusexception::ParamWrongException;
        
        /**
         * 生成授权码
         * @param [in] [offerId] [套餐id]
         * @param [in] [posOfferId] [定位分享套餐id]
         * @param [in] [verifyCode] [短信验证码]
         * @return [string] 生成的授权码，一次有效，默认有效期1周
         * @exception/throws DatabaseException 数据访问异常 
         */  
        string generrateAuthCode(string offerId, string posOfferId, string verifyCode) throws cusexception::DatabaseException;
        
        /**
         * 批量生成授权码
         * @param [in] [offerId] [套餐id]
         * @param [in] [posOfferId] [定位分享套餐id]
         * @param [in] [verifyCode] [短信验证码]
         * @param [in] [size] [数量]
         * @return [string] 生成的授权码列表
         * @exception/throws DatabaseException 数据访问异常 
         */  
        stringarray generrateAuthCodeInBatch(string offerId, string posOfferId, string verifyCode, int size) throws cusexception::DatabaseException;
        
        
         /**
         * 取得套餐列表
         * @return [offerList] 套餐列表
         * @exception/throws DatabaseException 数据访问异常 
         */  
        offerList getOffers() throws cusexception::DatabaseException;

         /**
         * 取得套餐列表（包含同屏信息）
         * @return json字符串
         * @exception/throws DatabaseException 数据访问异常
         */
        string getOffersV2() throws cusexception::DatabaseException;

         /**
         * 取得同屏套餐列表
         * @return json字符串
         * @exception/throws DatabaseException 数据访问异常
         */
        string getTongpingOffer() throws cusexception::DatabaseException;

        /**
         * 主控开始同屏播放
         * @param [in] [token] [登陆令牌]
         * @param [in] [streamUrl] [同屏流地址]
         * @exception/throws AccountException 登陆异常、账号异常
         */
        void tongpingStartNotify(string token, string streamUrl) throws  cusexception::AccountException;
        
        /**
         * 上报挂失手机的新号码
         * @param [in] [oldphone] [被挂失的号码]
         * @param [in] [phone] [新号码]
         * @exception/throws DatabaseException 数据访问异常
         * @exception/throws NumberFormatException 新号码格式错误
         * @exception/throws AuthException 老号码不是一个被挂失的号码、或者老号码未注册 
         */ 
        void reportNewNumberOfLostPhone(string oldphone, string phone) throws cusexception::DatabaseException,cusexception::NumberFormatException, cusexception::AuthException;
        
        /**
         * 发送系统维护信息
         * @param [in] [start] [系统维护开始时间]
         * @param [in] [end] [系统维护结束时间]
         * @param [in] [method] [发送方式] 
         * @param [in] [message] [自定义邮件内容]
         */ 
        void sendMaintenanceNote(long start, long end, int method, string message, string testemailaddr);

       /**
         * 注册客户端连接
         */
        void addClient(Ice::Identity id, string identity);

/*******************************web接口*******************************************/

        /**
         * 获取日志
         * @param [in] [orderId] [订单id]
         * @param [in] [fuqianlaId] [付钱拉id]
         * @param [in] [errorMessage] [错误信息，isSuccess为false时有效]
         * @param [in] [isSuccess] [成功、失败标志位]
         * @param [in] [receiveTime] [付钱拉收到订单时间]
         * @param [in] [completeTime] [付钱拉处理完成时间]
         * @return [string] 文件
         * @exception/throws DatabaseException 数据访问异常
         */
		string webGetlog(string phone, long start,long end, int type) throws cusexception::DatabaseException;
		
		/**
         * 确认付钱拉支付接口
         * @param [in] [orderId] [订单id]
         * @param [in] [fuqianlaId] [付钱拉id]
         * @param [in] [errorMessage] [错误信息，isSuccess为false时有效]
         * @param [in] [isSuccess] [成功、失败标志位]
         * @param [in] [receiveTime] [付钱拉收到订单时间]
         * @param [in] [completeTime] [付钱拉处理完成时间]
         * @exception/throws DatabaseException 数据访问异常
         */
		void webConfirmPay(string orderId, string fuqianlaId, string errorMessage, bool isSuccess, string receiveTime, string completeTime) throws cusexception::DatabaseException;
		
		/**
         * 获取微信accessToken
         */
		string webGetWeixinToken();
         /**
         * 登陆接口
         * @param [in] [username] [用户名]
         * @param [in] [password] [密码]
         * @param [out] [configmap] [返回的客户端存储在服务器上的配置]
         * @return [string] 登陆令牌（token）,作为身份认证信息，登陆每个请求都要带上token，否则报AccountException
         * @exception/throws AccountException 登陆异常、账号异常
         */
        string webLogin(string username, string password) throws cusexception::DatabaseException, cusexception::AccountException;
        /**
         * 登出服务器
         * @param [in] [token] [登陆标记]
         * @exception/throws AccountException
         */
        void webLogout(string token) throws cusexception::DatabaseException, cusexception::AccountException;   
        /**
         * 取得设备列表
         * @param [in] [token] [登陆标记]
         * @param [in] [start] [分页记录开始的位置]
         * @param [in] [num] [分页记录条数]
         * @param [in] [online] [是否在线]
         * @param [in] [deviceName] [设备名]
         * @param [in] [deviceId] [设备id]
         * @exception/throws AccountException
         */
        ["format:sliced"]
        deviceList webGetDeviceList(string token, int start, int num, bool online, string deviceName, string deviceId) throws cusexception::DatabaseException, cusexception::AccountException;   
        
        /**
         * 取得设备数量
         * @param [in] [token] [登陆标记]
         * @param [in] [online] [是否在线]
         * @param [in] [deviceName] [设备名]
         * @param [in] [deviceId] [设备id]
         * @exception/throws AccountException
         */
        ["format:sliced"]
        int webGetDeviceNum(string token, bool online, string deviceName, string deviceId) throws cusexception::DatabaseException, cusexception::AccountException;     

        /**
         * 删除指定时间GPS记录列表
         * @param [in] [token] [登陆标记]
         * @param [in] [deviceid] [设备id]
         * @param [in] [starttime] [开始时间]
         * @param [in] [endtime] [结束时间]
         * @exception/throws AccountException
         */
        ["format:sliced"]
        void webDelRecordList(string token, string deviceid, long starttime, long endtime) throws cusexception::DatabaseException, cusexception::AccountException;
        
        /**
         * 批量添加GPS记录
         * @param [in] [token] [登陆标记]
         * @param [in] [deviceid] [设备id]
         * @param [in] [records] [要添加的记录列表]
         * @exception/throws AccountException
         */
        ["format:sliced"]
        void webAddRecordList(string token, string deviceid, records list) throws cusexception::DatabaseException, cusexception::AccountException;
        
        /**
         * 取得GPS记录列表
         * @param [in] [token] [登陆标记]
         * @param [in] [deviceid] [设备id]
         * @param [in] [starttime] [开始时间]
         * @param [in] [endtime] [结束时间]
         * @param [in] [start] [分页记录开始的位置]
         * @param [in] [num] [分页记录条数]
         * @exception/throws AccountException
         */
        ["format:sliced"]
        records webGetRecordList(string token, string deviceid, long starttime, long endtime, int start, int num) throws cusexception::DatabaseException, cusexception::AccountException;      
        
        /**
         * 取得GPS记录数量
         * @param [in] [token] [登陆标记]
         * @param [in] [deviceid] [设备id]
         * @param [in] [starttime] [开始时间]
         * @param [in] [endtime] [结束时间]
         * @exception/throws AccountException
         */
        ["format:sliced"]
        int webGetRecordNum(string token, string deviceid, long starttime, long endtime) throws cusexception::DatabaseException, cusexception::AccountException;  
        
        /**
         * 取得帐号数量
         * @param [in] [token] [登陆标记]
         * @param [in] [deviceid] [设备id]
         * @param [in] [name] [账户名]
         * @exception/throws AccountException
         */
        ["format:sliced"]
        int webGetAccountNum(string token, string deviceid, string name) throws cusexception::DatabaseException, cusexception::AccountException;     
                
        /**
         * 重置帐号密码为出厂密码
         * @param [in] [token] [登陆标记]
         * @param [in] [id] [账户id]
         * @exception/throws AccountException
         */
        ["format:sliced"]
        void webResetAccountPassword(string token, string id) throws cusexception::DatabaseException, cusexception::AccountException;
        
        /**
         * 删除帐号
         * @param [in] [token] [登陆标记]
         * @param [in] [accountId] [帐号id]
         * @exception/throws AccountException
         */
        ["format:sliced"]
        void webDeleteAccount(string token, string accountId) throws cusexception::DatabaseException, cusexception::AccountException;
        
        /**
         * 获取栅栏
         * @param [in] [token] [登陆令牌]
         * @param [in] [deviceId] [设备id]
         * @return [fence] 栅栏list
         * @exception/throws AccountException
         */
        fences webGetFences(string token, string deviceId) throws cusexception::DatabaseException, cusexception::AccountException;     
        
        /**
         * 取得设备消息(报警信息)数量
         * @param [in] [token] [登陆标记]
         * @param [in] [deviceid] [设备id]
         * @param [in] [starttime] [开始时间]
         * @param [in] [endtime] [结束时间]
         * @return [int] 记录条数
         * @exception/throws AccountException
         */
        ["format:sliced"]
        int webGetDeviceMessageNum(string token, string deviceid, long starttime, long endtime) throws cusexception::DatabaseException, cusexception::AccountException;     

        /**
         * 取得设备消息(报警信息)列表
         * @param [in] [token] [登陆标记]
         * @param [in] [start] [分页记录开始的位置]
         * @param [in] [num] [分页记录条数]
         * @param [in] [deviceid] [设备id]
         * @param [in] [starttime] [开始时间]
         * @param [in] [endtime] [结束时间]
         * @exception/throws AccountException
         */
        ["format:sliced"]
        messages webGetDeviceMessageList(string token, int start, int num, string deviceid, long starttime, long endtime) throws cusexception::DatabaseException, cusexception::AccountException;             

         /**
         * 取得设备配置修改历史信息数量
         * @param [in] [token] [登陆标记]
         * @param [in] [deviceid] [设备id]
         * @param [in] [starttime] [开始时间]
         * @param [in] [endtime] [结束时间]
         * @exception/throws AccountException
         */
        ["format:sliced"]
        int webGetDeviceHistoryMessageNum(string token, string deviceid, long starttime, long endtime) throws cusexception::DatabaseException, cusexception::AccountException;     

        /**
         * 取得设备配置修改历史信息列表
         * @param [in] [token] [登陆标记]
         * @param [in] [start] [分页记录开始的位置]
         * @param [in] [num] [分页记录条数]
         * @param [in] [deviceid] [设备id]
         * @param [in] [starttime] [开始时间]
         * @param [in] [endtime] [结束时间]
         * @exception/throws AccountException
         */
        ["format:sliced"]
        deviceHistoryMessages webGetDeviceHistoryMessageList(string token, int start, int num, string deviceid, long starttime, long endtime) throws cusexception::DatabaseException, cusexception::AccountException;
                
        /**
         * 添加管理帐号
         * @param [in] [token] [登陆标记]
         * @param [in] [name] [账户名]
         * @param [in] [pass] [密码]
         * @exception/throws AccountException
         */
        ["format:sliced"]
        void webAddWebAccount(string token, string name, string pass) throws cusexception::DatabaseException, cusexception::AccountException; 

        
        /**
         * 修改管理帐号
         * @param [in] [id] [账户ID]
         * @param [in] [pass] [密码]
         * @exception/throws AccountException
         */
        ["format:sliced"]
        void webEditWebAccount(string token, string id, string pass) throws cusexception::DatabaseException, cusexception::AccountException; 
        
        /**
         * 删除管理帐号
         * @param [in] [token] [登陆标记]
         * @param [in] [accountId] [帐号id]
         * @exception/throws AccountException
         */
        ["format:sliced"]
        void webDeleteWebAccount(string token, string accountId) throws cusexception::DatabaseException, cusexception::AccountException;
        
        /**
         * 管理帐号列表
         * @param [in] [token] [登陆标记]
         * @param [in] [accountId] [帐号id]
         * @exception/throws AccountException
         */
        ["format:sliced"]
        webaccounts webGetWebAccountList(string token) throws cusexception::DatabaseException, cusexception::AccountException;
        
        /**
         * 取得管理帐号
         * @param [in] [token] [登陆标记]
         * @param [in] [accountId] [账号id]
         * @exception/throws AccountException
         */
        ["format:sliced"]
        databean::WebAccount webGetWebAccount(string token, string accountId) throws cusexception::DatabaseException, cusexception::AccountException; 
        
        /**
         * 绑定邮箱
         * @param [in] [bindcode] 六位整数验证码
         * @exception/throws DatabaseException,AccountException 验证码错误或者邮箱已被其它用户绑定会抛出DatabaseException
         */
        ["format:sliced"]
         void webBindEmail(string bindcode, string sig) throws cusexception::DatabaseException, cusexception::AccountException;
         
        /**
         * 修改密码（找回密码）
         * @param [in] [bindcode] [ 六位整数验证码]
         * @param [in] [password] 新密码
         * @exception/throws AccountException，DatabaseException 验证码错误，会抛出DatabaseException
         */
        ["format:sliced"]
         void webEditPassword(string bindcode, string sig, string password) throws cusexception::DatabaseException, cusexception::AccountException;
        
        /**
         * 取得"定位分享"信息
         * @param [in] [positionURLId] [定位分享id]
         * @exception/throws DatabaseException
         */
        databean::PositionURL webGetPositionURL(string positionURLId) throws cusexception::DatabaseException;
         
        /**
         * 保存"定位分享"GPS数据
         * @param [in] [positionURLId] [定位分享id]
         * @exception/throws DatabaseException
         */
        void webSavePosition(string positionURLId, double lng, double lat, string location,string error, bool isSuccess) throws cusexception::DatabaseException;
        
         /**
         * 验证openid是否已绑定设备
         * @param [in] [openid] [微信传过来的openid号]
         * @param [out] [deviceid] [如果已绑定，返回设备id]
         * @return [bool] 是或者否
         * @exception/throws AccountException
         */
        ["format:sliced"]
         bool isBind(string openid, out string deviceid) throws cusexception::DatabaseException;
         
         /**
         * 将openid绑定设备
         * @param [in] [openid] [微信传过来的openid号]
         * @param [in] [name] [用户名]
         * @param [in] [password] [密码]
         * @exception/throws AccountException
         */
        ["format:sliced"]
         void bind(string openid, string name, string password) throws cusexception::DatabaseException, cusexception::AccountException;
         
         /**
         * 将openid绑定设备解绑
         * @param [in] [openid] [微信传过来的openid号]
         * @exception/throws AccountException
         */
        ["format:sliced"]
         void unBind(string openid) throws cusexception::DatabaseException;
         
         /**
         * 获取指定设备的最后一条记录
         * @param [in] [deviceId] [设备号]
         * @return [Record] 记录,如果一条记录也没有返回null
         * @exception/throws DatabaseException
         */
        ["format:sliced"]
        databean::Record weixinGetLastRecord(string deviceId) throws cusexception::DatabaseException;
        
        /**
         * 取得设备信息
         * @param [in] [deviceId] [设备号]
         * @return [databean::Device] 设备信息
         * @exception/throws DatabaseException
         */
         ["format:sliced"]
        databean::Device weixinGetDeviceinfo(string deviceId) throws cusexception::DatabaseException;
        
        /**
         * 更新设备信息
         * @param [in] [device] [设备信息，只有一个字段的值是有效的]
         * @param [in] [editField] [要修改的字段]
         * @exception/throws DatabaseException
         */
         ["format:sliced"]
        void weixinUpdateDeviceinfo(databean::Device device, string editField) throws cusexception::DatabaseException;
        
         /**
         * 取得设备报警消息
         * @param [in] [deviceId] [设备Id]
         * @param [in] [time] [记录截止时间]
         * @param [in] [num] [记录最多多少条]
         * @return [messages] 报警记录
         * @exception/throws DatabaseException
         */
         ["format:sliced"]
        messages weixinGetDeviceMessages(string deviceId, long time, int num) throws cusexception::DatabaseException;
        
        /**
         * 取得设备报警消息
         * @param [in] [deviceid] [设备id]
         * @param [in] [starttime] [开始时间]
         * @param [in] [endtime] [结束时间]
         * @return [int] 记录条数
         * @exception/throws DatabaseException
         */
         ["format:sliced"]
        int weixinGetDeviceMessageNum(string deviceId, long starttime, long endtime) throws cusexception::DatabaseException;

        /**
         * 更新权限
         * @param [in] [token] [登陆令牌]
         * @return [byte[]] 设备限制信息
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         */
        void updateDeviceLimitPB(string deviceId, bytearray deviceLmitPB, bool ignoreUpgrade) throws cusexception::DatabaseException, cusexception::AccountException;

        /**
         * 更新权限
         * @param [in] [token] [登陆令牌]
         * @return [byte[]] 设备限制信息
         * @exception/throws DatabaseException 数据访问异常
         */
        void webUpdateDeviceLimitPB(string phone, bytearray deviceLmitPB) throws cusexception::DatabaseException;

        /**
         * 获取权限
         * @param [in] [phone] [账户]
         * @return [byte[]] 设备限制信息
         * @exception/throws DatabaseException 数据访问异常
         */
        bytearray webGetDeviceLimitPB(string phone) throws cusexception::DatabaseException;
        /**
         * 取得服务器IP
         * @return [string] 服务器IP
         */
        string getServerIp();
        /**
         * 获取设备的所有配置项值，不存在会返回空map
         * @param [in] [token] [登陆令牌]
         * @param [in] [phone] 目标账户，必须是已关注账户
         * @param [in] [key] 设置项key
         * @return [in] [string] 配置项值（字符串类型）
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         * @exception/throws ParamWrongException key或value不符合要求（不能为空)
         */
        paramMap webGetDeviceConfigMap(string phone) throws cusexception::DatabaseException, cusexception::ParamWrongException;
        /**
         * 给设备添加配置项，key/value都是字符串类型，已存在的key会被覆盖
         * @param [in] [token] [登陆令牌]
         * @param [in] [key] 设置项key
         * @param [in] [value] 设置项值
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         * @exception/throws ParamWrongException key或value不符合要求（不能为空)
         * @exception/throws AuthException 权限不足
         */
        void webAddConfigToDevice(string phone, string key, string value) throws cusexception::DatabaseException, cusexception::ParamWrongException;
        /**
         * 给所有设备发送device update更新消息
         * @exception/throws DatabaseException 数据访问异常
         */
        void webSendAllUpdateDevice() throws cusexception::DatabaseException;
        /**
         * 更新挂失状态
         * @param [in] [phone] [手机]
         * @param [in] [isLost] 是否挂失
         * @exception/throws AccountException token失效，需重新登陆
         * @exception/throws DatabaseException 数据访问异常
         */
        void webUpdateLost(string phone, bool isLost) throws cusexception::DatabaseException;
        /**
         * 更新注销状态
         * @param [in] [phone] [手机]
         * @param [in] [unregist] 是否注销
         * @exception/throws DatabaseException 数据访问异常
         */
        void webUpdateUnregist(string phone, bool unregist) throws cusexception::DatabaseException;
        /**
         * @param [in] [phone] [手机]
         * @return [databean::Device] 设备信息
         * @exception/throws DatabaseException 数据访问异常
         */
        databean::Device webGetDeviceinfo(string phone) throws cusexception::DatabaseException;
    };
};
#endif //_I_INTERFACE_ICE_
